//导入位置服务模块
import geoLocationManager from '@ohos.geoLocationManager';

import { expect } from '@ohos/hypium';

//导入自定定义的权限检查模块
import { checkAccess } from 'ets/service/Detector';

//定义节点标签
const TAG_NODE0 = '------[Geo-Node0]';
const TAG_NODE1 = '------[Geo-Node1]';
const TAG_NODE2 = '------[Geo-Node2]';

/**
 * 获取用户设备当前所处位置的经纬度数据
 */
async function node1GetGeographicalPosition() {
  console.log('Geo.node1GetGeographicalPosition============01=');
  //预定义返回值
  let output = {
    'imei': null,
    'latitude': null,   //纬度
    'longitude': null,  //经度
    'altitude': null,   //海拔高度
    'accuracy': null,   //精确程度
    'speed': null,      //速度
    'timeStamp': null,  //时间戳
    'direction': null,  //方向
    'timeSinceBoot': null,  //时间戳的起点
    'isFinished': false,
    'error': '',
  };
  console.log('Geo.node1GetGeographicalPosition============02=');
  //检查定位功能是否可用
  if ( !geoLocationManager.isLocationEnabled() ) {
    console.log('Geo.node1GetGeographicalPosition============03=');
    output.error = '定位：定位功能不可用，请检查设备或者服务器';
    return output;
  }
  console.log('Geo.node1GetGeographicalPosition============04=');

  //定义需要输入的请求参数,
  //0x201: geoLocationManager.LocationRequestPriority.ACCURACY
  //0x302: geoLocationManager.LocationRequestScenario.TRAJECTORY_TRACKING
  let requestInfo = {'priority': 0x201, 'scenario': 0x302, 'maxAccuracy': 0};
  //等待模块完成获取地理位置的异步操作
  try {
    await geoLocationManager.getCurrentLocation(requestInfo).then((result) => {
      console.info(TAG_NODE1 + 'Suceed! Current location => latitude:' + result.latitude + '; loggitude:' + result.longitude);
      //记录获取的地理信息
      output.latitude = result.latitude;  //纬度
      output.longitude = result.longitude; //经度
      output.altitude = result.altitude;  //海拔高度
      output.accuracy = result.accuracy;
      output.speed = result.speed;  //速度
      output.timeStamp = result.timeStamp;            //时间戳，UTC格式。
      output.direction = result.direction;
      output.timeSinceBoot = result.timeSinceBoot;    //时间戳，开机时间格式。

      output.isFinished = true; //结点函数的执行状态修改为成功
      console.log('Geo.node1GetGeographicalPosition============05=', JSON.stringify(result));
    }).catch((error) => {
      console.log('Geo.node1GetGeographicalPosition============06=');
      output.error = '定位：地理位置获取失败';
      return output;
    });
  }catch (error) {
    console.log('Geo.node1GetGeographicalPosition============07=', JSON.stringify(error));
    output.error = '定位：地理位置获取失败';
    return output;
  }
  return output;
}
/**
 * 获取用户设备当前所处的城市中文名称
 * @returns
 */
async function node2GetGeographicalPosition(input) {
  //预定义返回值
  let output = {
    'position_x': input.position_x,
    'position_y': input.position_y,
    'position_z': input.position_z,
    'cityName': '未知',
    'speed': input.speed,
    'isFinished': false,
    'error': '无',
  };
  //检查逆地理编码转换服务是否可用
  if ( !geoLocationManager.isGeocoderAvailable() ) {
    console.log(TAG_NODE2 + 'Geocoder module loads fail');
    output.error = '地理编码转换功能不可用，请检查设备或者服务器';
    return;
  }
  //定义需要输入的请求参数
  let reverseGeoCodeRequest = {'locale': 'zh', 'latitude': input.position_x, 'longitude': input.position_y, 'maxItems': 1};
  //等待模块完成获取地理位置的异步操作
  try {
    await geoLocationManager.getAddressesFromLocation(reverseGeoCodeRequest).then((result) => {
      console.info(TAG_NODE2 + 'City Name:' + result[0].locality);
      //记录获取的地理信息
      output.cityName = result[0].locality;  //城市名
      output.isFinished = true; //结点函数的执行状态修改为成功
    }).catch((error) => {
      console.error(TAG_NODE1 + 'get current location failed, eror:' + JSON.stringify(error));
      output.error = '逆地理编码转换失败';
    });
  }catch (error) {
    console.error(TAG_NODE1 + 'get current location failed, eror:' + JSON.stringify(error));
    output.error = '逆地理编码转换失败';
  }
  return output;
}

//导出可供调用的接口
export async function getGeoData() {
  console.log('Geo.getGeoData============01=');
  //
  if ( ! (await checkAccess()) ) {
    console.log('Geo.getGeoData============02=');
    return {
      'imei': null,
      'latitude': null,   //纬度
      'longitude': null,  //经度
      'altitude': null,   //海拔高度
      'accuracy': null,   //精确程度
      'speed': null,      //速度
      'timeStamp': null,  //时间戳
      'direction': null,  //方向
      'timeSinceBoot': null,  //时间戳的起点
      'isFinished': false,
      'error': '设备未获取定位权限,请使用<获取定位权限>功能授权',
    }
  }

  console.log('Geo.getGeoData============03=');
  //
  let output = await node1GetGeographicalPosition();
  console.log('Geo.getGeoData============04=');
  if ( !output.isFinished ) {
    console.log('Geo.getGeoData============05=');
    return output;
  }
  console.log('Geo.getGeoData============06=');
  return output;
  //
  //return await node2GetGeographicalPosition(output);
}